package com.example.tms.controller;

import com.example.tms.bean.*;
import com.example.tms.mapper.*;
import com.example.tms.tools.GlobalParam;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import com.example.tms.annotation.*;
/**
 * 角色权限信息
 */
@RestController
public class RolePermsController {

    private final UserMapper userMapper;
    private final RoleMapper roleMapper;
    private final RoleVMapper roleVMapper;
    private final PermsVMapper permsVMapper;
    private final RolePermsMapper rolePermsMapper;
    private final UserRoleMapper userRoleMapper;


    @Autowired
    public RolePermsController(UserMapper userMapper, RoleMapper roleMapper, RoleVMapper roleVMapper, PermsVMapper permsVMapper, RolePermsMapper rolePermsMapper, UserRoleMapper userRoleMapper){
        this.userMapper = userMapper;
        this.roleMapper = roleMapper;
        this.roleVMapper = roleVMapper;
        this.permsVMapper = permsVMapper;
        this.rolePermsMapper = rolePermsMapper;
        this.userRoleMapper = userRoleMapper;
    }

    //查看角色权限
    @RequiresPermissions("521")
    @RequestMapping(value = "/role/{jsid}",method = RequestMethod.GET)
    public ReturnInfo getRolePermission(@PathVariable String jsid){
        String message;
        if(roleMapper.findByJsidAndSfcz(jsid,true)==null){
            message = "角色不存在！";
            return ReturnInfo.info4(message,"");
        }else {
            message = "成功！";
            List<PermsView> permsViews =  permsVMapper.findByJsid(jsid);
            List<String> permsidList = new ArrayList<>();
            for(PermsView permsView : permsViews){
                permsidList.add(permsView.getQxid());
            }
            return ReturnInfo.info4(message , permsidList);
        }
    }

    //查询角色列表
    @RequiresPermissions("521")
    @RequestMapping(value = "/rolelist",method = RequestMethod.GET)
    public ReturnInfo getRoleList(@RequestParam(required = false, defaultValue = "") String jsmc){
        List<RoleInfo> result = roleMapper.findAll((Root<RoleInfo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)->{
            List<Predicate> list = new ArrayList<>();
            if(!jsmc.equals("")){
                list.add(criteriaBuilder.like(root.get("jsmc").as(String.class), "%" + jsmc + "%"));
            }
            list.add(criteriaBuilder.equal(root.get("sfcz").as(Boolean.class),true));
            Predicate[] p = new Predicate[list.size()];
            criteriaQuery.where(criteriaBuilder.and(list.toArray(p)));
            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("jstime")));
            return criteriaQuery.getRestriction();
        });
        return ReturnInfo.info2(result);
    }

    //查询角色
    @RequiresPermissions("521")
    @RequestMapping(value = "/role",method = RequestMethod.GET)
    public ReturnInfo getRole(@RequestParam(required = false, defaultValue = "") String jsid){
        List<RoleView> result = roleVMapper.findAll((Root<RoleView> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)->{
            criteriaQuery.where(criteriaBuilder.equal(root.get("jsid").as(String.class), jsid));
            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("urtime")));
            return criteriaQuery.getRestriction();
        });
        return ReturnInfo.info2(result);
    }

    //新建角色
    @MonitorRequest
    @RequiresPermissions("522")
    @RequestMapping(value = "/role",method = RequestMethod.POST)
    public ReturnInfo creatRole(@RequestBody RoleInfo roleInfo){
        String message = "角色新建成功！";
        if( roleMapper.findByJsmcAndSfcz(roleInfo.getJsmc())!=null){
            message = "角色名称已存在！";
        }else {
            RoleInfo role = new RoleInfo(roleInfo.getJsmc());
            roleMapper.save(role);
            for(String permsid : roleInfo.getPermsidList()){
                if(checkPerms(permsid)){
                    RolePerms rolePerms = new RolePerms(role.getJsid(),permsid);
                    rolePermsMapper.save(rolePerms);
                }
            }
        }
        return ReturnInfo.info1(message);
    }

    //更新角色
    @MonitorRequest
    @RequiresPermissions("523")
    @RequestMapping(value = "/role",method = RequestMethod.PUT)
    public ReturnInfo updateRole(@RequestBody RoleInfo roleInfo){
        String message = "角色更新成功！";
        if(roleMapper.findByJsidAndSfcz(roleInfo.getJsid(),true)==null){
            message = "角色不存在!";
        }else {
            roleMapper.modifyMc(roleInfo.getJsid(),roleInfo.getJsmc());
            rolePermsMapper.deleteByJsid(roleInfo.getJsid());
            for(String permsid : roleInfo.getPermsidList()){
                if(checkPerms(permsid)){
                    RolePerms rolePerms = new RolePerms(roleInfo.getJsid(),permsid);
                    rolePermsMapper.save(rolePerms);
                }
            }
        }
        return ReturnInfo.info1(message);
    }

    //用户-角色绑定
    @MonitorRequest
    @RequiresPermissions("525")
    @RequestMapping(value = "user/role",method = RequestMethod.POST)
    public ReturnInfo creatUserRole(@RequestBody UserRole userRole){
        String message;
        if(userRole.getYhid()==null||userRole.getYhid().equals("")||userMapper.findByYhid(userRole.getYhid())==null){
            message = "用户不存在！";
        }else if (userRole.getJsid()==null||userRole.getJsid().equals("")||roleMapper.findByJsidAndSfcz(userRole.getJsid(),true)==null){
            message = "角色不存在！";
        }else if(userRoleMapper.findByYhidAndJsid(userRole.getYhid(),userRole.getJsid())!=null){
            message = "关系已存在！";
        }else {
            message = "添加成功！";
            userRole.setUrtime(GlobalParam.getTime());
            userRoleMapper.save(userRole);
        }
        return ReturnInfo.info1(message);
    }

    //用户-角色删除绑定
    @MonitorRequest
    @RequiresPermissions("525")
    @RequestMapping(value = "user/role",method = RequestMethod.DELETE)
    public ReturnInfo deleteUserRole(@RequestBody UserRole userRole){
        String message;
        if(userRole.getYhid()==null||userRole.getYhid().equals("")){
            message = "用户不存在！";
        }else if(userRole.getJsid()==null||userRole.getJsid().equals("")){
            message = "角色不存在！";
        }else if (userRoleMapper.findByYhidAndJsid(userRole.getYhid(), userRole.getJsid())==null){
            message = "关系不存在！";
        }else {
            userRoleMapper.deleteByYhidAndJsid(userRole.getYhid(), userRole.getJsid());
            message = "删除成功！";
        }
        return ReturnInfo.info1(message);
    }

    //角色删除
    @MonitorRequest
    @RequiresPermissions("524")
    @RequestMapping(value = "role/{jsid}",method = RequestMethod.DELETE)
    public ReturnInfo deleteUserRole(@PathVariable String jsid){
        String message = "删除成功！";
        if(roleMapper.findByJsidAndSfcz(jsid,true)==null){
            message = "角色不存在！";
            return ReturnInfo.info1(message);
        }else if (!userRoleMapper.findByJsid(jsid).isEmpty()) {
            message = "该角色存在用户，不可删除！";
            return ReturnInfo.info1(message);
        }else {
            roleMapper.DeleteByJsid(jsid);
            return ReturnInfo.info1(message);
        }
    }

    private Boolean checkPerms(String permsid){
        return (permsid.equals("111")||permsid.equals("112")||permsid.equals("113")||permsid.equals("114")||permsid.equals("121")||permsid.equals("122")
                ||permsid.equals("123")||permsid.equals("124")||permsid.equals("131")||permsid.equals("132")||permsid.equals("133")||permsid.equals("134")
                ||permsid.equals("141")||permsid.equals("1410")||permsid.equals("1411")||permsid.equals("142")||permsid.equals("143")||permsid.equals("144")
                ||permsid.equals("145")||permsid.equals("146")||permsid.equals("147")||permsid.equals("148")||permsid.equals("149")||permsid.equals("151")
                ||permsid.equals("152")||permsid.equals("153")||permsid.equals("154")||permsid.equals("161")||permsid.equals("162")||permsid.equals("163")
                ||permsid.equals("164")||permsid.equals("211")||permsid.equals("212")||permsid.equals("213") ||permsid.equals("214")||permsid.equals("215")
                ||permsid.equals("216")||permsid.equals("217")||permsid.equals("218")||permsid.equals("221")||permsid.equals("222")
                ||permsid.equals("223")||permsid.equals("224")||permsid.equals("225")||permsid.equals("231")||permsid.equals("232")||permsid.equals("233")
                ||permsid.equals("234")||permsid.equals("241")||permsid.equals("242")||permsid.equals("243")||permsid.equals("244")||permsid.equals("251")
                ||permsid.equals("252")||permsid.equals("253")||permsid.equals("254")||permsid.equals("261")||permsid.equals("262")||permsid.equals("263")
                ||permsid.equals("271")||permsid.equals("272")||permsid.equals("311")||permsid.equals("312")||permsid.equals("313")||permsid.equals("321")
                ||permsid.equals("322")||permsid.equals("323")||permsid.equals("331")||permsid.equals("332")||permsid.equals("333")||permsid.equals("411")
                ||permsid.equals("412")||permsid.equals("413")||permsid.equals("414")||permsid.equals("415")||permsid.equals("416")||permsid.equals("417")
                ||permsid.equals("421")||permsid.equals("422")||permsid.equals("423")||permsid.equals("424")||permsid.equals("431")||permsid.equals("432")
                ||permsid.equals("433")||permsid.equals("434")||permsid.equals("511")||permsid.equals("512")||permsid.equals("513")||permsid.equals("514")||permsid.equals("515")
                ||permsid.equals("521")||permsid.equals("522")||permsid.equals("523")||permsid.equals("524")||permsid.equals("525")||permsid.equals("1")||permsid.equals("11")
                ||permsid.equals("12")||permsid.equals("13")||permsid.equals("14")||permsid.equals("15")||permsid.equals("16")||permsid.equals("2")||permsid.equals("21")
                ||permsid.equals("22")||permsid.equals("23")||permsid.equals("24")||permsid.equals("25")||permsid.equals("26")||permsid.equals("27")
                ||permsid.equals("3")||permsid.equals("31")||permsid.equals("32")||permsid.equals("33")||permsid.equals("4")||permsid.equals("41")
                ||permsid.equals("42")||permsid.equals("43")||permsid.equals("5")||permsid.equals("51")||permsid.equals("52")||permsid.equals("53")||permsid.equals("54")||permsid.equals("55")
                ||permsid.equals("28")||permsid.equals("281")||permsid.equals("282")||permsid.equals("283")||permsid.equals("284"));
    }
}
